/*************************************************
 *	文件名称：mydata.c
 *	文件说明：文件为动态单链线性表的函数实现文件
 *	程序平台：
 *	文件作者：Jason <jasonsunsoft@163.com> 
 *	文件时间：2014年8月21日 20:07
*************************************************/
#include "mydata.h"

Status GetElem_L(LinkList L, int i, ElemType *e)
{
	LinkList p;
	int j;

	p = L->next;
	j = 1;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
		return ERROR;
	*e = p->data;
	return OK;
}//GetElem_L

Status ListInsert_L(LinkList *L, int i, ElemType e)
{
	LinkList p, s;
	int j = 0;

	p = *L;
	while (p && j < i-1)
	{
		p = p->next;
		++j;
	}
	if (!p || j > i-1)
		return ERROR;
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}//ListInsert_L

Status ListDelete_L(LinkList *L, int i, ElemType *e)
{
	LinkList p, q;
	int j = 0;

	p = *L;
	while(p->next && j < i - 1)
	{
		p = p->next;
		++j;
	}
	if(!(p->next) || j > i - 1)
		return ERROR;
	q = p->next;
	p->next = q->next;
	*e = q->data;
	free(q);
	return OK;
}//ListDelete_L


//算法2.11 CreateList_L 一个从表尾到表头逆向建立单链表的算法
void CreateList_L(LinkList *L, int n)
{
	int i;
	LinkList p;

	*L = (LinkList) malloc(sizeof(LNode));
	(*L)->next = NULL;	//先建立一个带头节点的单链表
	for (i = n; i > 0; --i)
	{
		p = (LinkList) malloc(sizeof(LNode));	//生成新的节点
		scanf("%d",&(p->data));						//输入元素值
		p->next = (*L)->next;						//插入到表头
		(*L)->next = p;
	}
}//CreateList_L

//算法2.12 将两个有序链表合并为一个有序链表
void MergelList_Sq(LinkList *La, LinkList *Lb, LinkList *Lc)
{
	LinkList pa, pb, pc;

	pa = (*La)->next;
	pb = (*Lb)->next;
	*Lc = pc = *La;				//用La的头结构作为Lc的头节点
	while(pa && pb)
	{
		if (pa->data <= pb->data)
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else
		{
			pc->next = pb;
			pc = pb;
			pa = pb->next;
		}
	}
	pc->next = pa?pa:pb;	//插入剩余段
	free(*Lb);				//释放Lb的头结点
}//MergelList_Sq


